package design.pattern.Lu07PrototypePattern;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @program JavaBase
 * @description: 原型模式
 * 浅拷贝：
 *  使用原型模式时，引用的成员变量必须满足两个条件才不会被拷贝：
 *      - 一是类的成员变量，而不是方法内变量；
 *      - 二是必须是一个可变的引用对象，而不是一个原始类型或不可变对象。
 *  结论：基本类型会被拷贝，没有被拷贝的，与原始类公用一个内存地址
 * @author: zhanglu
 * @create: 2020-03-29 16:54:00
 */
public class Lu07PrototypePattern {

    public static void main(String[] args) throws CloneNotSupportedException {

        Person person = new Person();
        person.setName("zhangsan");

        person.setDescsValue("1");

        person.setDescsValue("2");
        person.setAge(23);
        System.out.println(person.toString());
        Person p1 = (Person) person.clone();

        person.setDescsValue("2");
        person.setAge(24);

        System.out.println(p1.toString());

    }

}

@Data
class Person implements Cloneable{

    private String name;
    private int age;

    private ArrayList<String> descs = new ArrayList<>();

    public void setDescsValue(String s){
        this.descs.add(s);
    }

    public List<String> getDescs(){
        return this.descs;
    }

//    /**
//     * 浅拷贝
//     * @return
//     */
//    @Override
//    protected Object clone() {
//        Person clone = null;
//        try {
//            clone = (Person) super.clone();
//        } catch (CloneNotSupportedException e) {
//            e.printStackTrace();
//        }
//        return clone;
//    }

    /**
     * 深拷贝
     * @return
     */
    @Override
    protected Object clone() {
        Person clone = null;
        try {
            clone = (Person) super.clone();
            clone.descs = (ArrayList<String>) this.descs.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }



}
